package handler

import (
	"gitee.com/gopher2011/casdoor/internal/logic/login"
	"gitee.com/gopher2011/casdoor/internal/svc"
	"gitee.com/gopher2011/casdoor/internal/types"
	"github.com/gin-gonic/gin"
)

func GetHumanCheck(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.GetHumanCheck(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func Login(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.Login(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func Logout(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.Logout(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func Signup(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.Signup(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func Unlink(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.Unlink(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func GetAccount(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.GetAccount(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func GetUserinfo(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.GetUserinfo(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func GetApplicationLogin(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.GetApplicationLogin(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func GetSamlLogin(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.GetSamlLogin(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func HandleSamlLogin(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := login.NewLogin(c.Request.Context(), svc.Svc)
	resp, err := l.HandleSamlLogin(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}
